package remote;

import java.io.*;
import com.sun.xfile.*;

import java.util.logging.Level;
import java.util.logging.Logger;


public class NFS2 {
    private String URL;
    private String filename;


    public NFS2(String URL, String filename){
        this.URL = URL;
        this.filename = filename;
    }

      /**
     * Metodo para returnar o FileStream para o ficheiro pretendido no servidor NFS
     * @return Valor do tipo FileStream correspondente ao ficheiro pretendido.
     */
    public InputStream getFileStream(){
        XFileInputStream xr = null;
        try {
            XFile xf = new XFile(URL + "/" + filename);
            xr = new XFileInputStream(xf);
            return ((InputStream)xr);
        } catch (IOException ex) {
            Logger.getLogger(NFS2.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                xr.close();
            } catch (IOException ex) {
                Logger.getLogger(NFS2.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return null;
    }
     /**
     * Metodo para verificar se o ficheiro pretendido está no servidor e disponivel
     * @return Valor boolean - true se estiver tudo bem, false qualquer outro caso.
     */
    public boolean fileisok (){

        XFile xf = new XFile(URL + "/" + filename);
        try {
            XRandomAccessFile xraf = new XRandomAccessFile(xf, "r");
            int count = 10;
            xraf.seek(count);
            //System.out.println("Value at position " + count + " is " + (byte) xraf.read());
            //System.out.println("Current file position is " + xraf.getFilePointer());
            xraf.seek(0);
            for (count = 0; count < 100; count++) {
                int val = xraf.read();
                if (val == -1) {
                    break;
                }
                //System.out.print(val);
            }
            return true;
        } catch (IOException ex) {
            Logger.getLogger(NFS2.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }
    /**
     * Metodo para efectuar o download do ficheiro de um servidor NFS
     * @param fout - Destino para o ficheiro
     * @return Valor boolean - true se copiado com sucesso, false qualquer outro caso.
     */
    public boolean downlaodFile (String fout){
        XFileInputStream xr = null;
        try {
            XFile xf = new XFile(URL + "/" + filename);
            if (xf.exists()) {
                System.out.println("Existe!");
            }
            xr = new XFileInputStream(xf);
            OutputStream out = new FileOutputStream(fout);
            byte[] buf = new byte[1024];
            int len;
            while ((len = xr.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
            out.close();
            System.out.println("Ficheiro Copiado com sucesso!");
            return true;
        } catch (IOException ex) {
            Logger.getLogger(NFS2.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        } finally {
            try {
                xr.close();
            } catch (IOException ex) {
                Logger.getLogger(NFS2.class.getName()).log(Level.SEVERE, null, ex);
                return false;
            }
        }
    }
    /**
     * Metodo para efectuar o upload do ficheiro para um servidor NFS
     * @param fout - Destino para o ficheiro
     * @return Valor boolean - true se copiado com sucesso, false qualquer outro caso.
     */
        public boolean uploadFile (String ori){
            XFileOutputStream xw = null;
            XFileInputStream xr = null;
        try {
            XFile xf = new XFile(URL + "/" + ori);
            if (xf.exists()) {
                System.out.println("Existe!");
            }
            xw = new XFileOutputStream(xf);
            xr = new XFileInputStream(ori);
            //OutputStream out = new FileOutputStream(fout);
            byte[] buf = new byte[1024];
            int len;
            while ((len = xr.read(buf)) > 0) {
                xw.write(buf, 0, len);
            }
            xw.close();
            System.out.println("Ficheiro Copiado com sucesso!");
            return true;
        } catch (IOException ex) {
            Logger.getLogger(NFS2.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        } finally {
            try {
                xw.close();
                xr.close();
            } catch (IOException ex) {
                Logger.getLogger(NFS2.class.getName()).log(Level.SEVERE, null, ex);
                return false;
            }
        }
    }

        /**
     * Metodo para verificar se o servidor NFS está online
     * @return Valor boolean - true se sucesso, false qualquer outro caso.
     */
    public boolean exists()
    {
        try {
        XFile xf = new XFile(URL+"/"+filename);
        if (xf.exists())
            return true;
        } catch (Exception e) {
            System.out.println(e.toString());
            e.printStackTrace(System.out);
            return false;
          }
        return false;
     }
}